package com.pxt.demo;

import android.text.TextUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PinyinUtil {

    private static List<List<String>> pairList = new ArrayList<>();
    private static List<String> smList;
    private static PinyinUtil instance;

    // 1、不能与“a”相拼的声母有j. q .x. r
    //2、不能与“o”相拼的声母有d. t.n. l. g .k .h. j .q. x. zh. ch. sh. r. z. c.s .y
    //3、不能与“e”相拼的声母有b. p.f. j. q. x. w
    //4、不能与“i”相拼的声母有f. g .k. h.w
    //5、不能与“u”相拼的声母有j. q. x. y
    //6、不能与“ü”相拼的声母有b. p. m .f. d. t.g .k. h.zh. ch. sh. r. z. c. s. w
    //7、不能与“ai”相拼的声母有f. j. q. x. r. y
    //8、不能与“ei”相拼的声母有t.k. j. q. x. zh. ch. sh. r.c. s. y
    //9、不能与“Ui”相拼的声母有b. p. m .f.n. l .j. q. x. y . w
    //10、不能与“ao”相拼的声母有f. j. q. x.w
    //11、不能与“ou”相拼的声母有b.j. q. x. w
    //12、不能与“iu”相拼的声母有b. p.f.t.g .k. h.zh. ch. sh. r. z. c. s. y .w
    //13、不能与“ie”相拼的声母有f.g .k. h.zh. ch. sh. r. z. c. s. y .w
    //14、不能与“üe”相拼的声母有b. p. m .f. d. t. g .k. h.zh. ch. sh. r. z. c. s.w
    //15、不能与“an”相拼的声母有j. q. x
    //16、不能与“en”相拼的声母有t.l . j. q. x.y
    //17、不能与“in”相拼的声母有f. d. t.g .k. h.zh. ch. sh. r. z. c. s. w
    //18、不能与“un”相拼的声母有b. p. m .f. n. j. q. x. z. y .w
    //19、不能与“ün”相拼的声母有b. p. m .f. d. t.n. l .g .k. h. zh. ch. sh. r. z. c. s w
    //20、不能与“ang”相拼的声母有j. q. x.
    //21、不能与“eng”相拼的声母有j. q. x. y
    //22、不能与“ing”相拼的声母有f. g .k. h. zh. ch. sh. r. z. c. s. y .w
    //23、不能与“ong”相拼的声母有b. p. m .f. j. q. x. sh. w
    private String[] shengmu = {"b", "p", "m", "f", "d", "t", "n", "l", "g", "k", "h", "j", "q", "x", "zh", "ch", "sh", "r", "z", "c", "s", "y", "w"};
    private String[][] pairs = {
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "er", "o", "ou"},
            {"a", "ai", "an", "ang", "ao", "ei", "en", "eng", "i", "ian", "iao", "ie", "in", "ing", "o", "u"},// b
            {"a", "ai", "an", "ang", "ao", "ei", "en", "eng", "i", "ian", "iao", "ie", "in", "ing", "o", "ou", "u"},// p
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ian", "iao", "ie", "in", "ing", "iu", "o", "ou", "u"},// m
            {"a", "an", "ang", "ei", "en", "eng", "iao", "o", "ou", "u"},// f
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ia", "ian", "iao", "ie", "ing", "iu", "ong", "ou", "u", "uan", "ui", "un", "uo"},// d
            {"a", "ai", "an", "ang", "ao", "e", "ei", "eng", "i", "ian", "iao", "ie", "ing", "ong", "ou", "u", "uan", "ui", "un", "uo"},// t
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ian", "iang", "iao", "ie", "in", "ing", "iu", "ong", "ou", "u", "uan", "un", "uo", "ue", "v", "ve"},// n
            {"a", "ai", "an", "ang", "ao", "e", "ei", "eng", "i", "ia", "ian", "iang", "iao", "ie", "in", "ing", "iu", "o", "ong", "ou", "u", "uan", "un", "uo", "ue", "v", "ve"},// l
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "ong", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// g
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "ong", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// k
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "ong", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// h
            {"i", "ia", "ian", "iang", "iao", "ie", "in", "ing", "iong", "iu", "u", "uan", "ue", "ve", "un"},// j
            {"i", "ia", "ian", "iang", "iao", "ie", "in", "ing", "iong", "iu", "u", "uan", "ue", "ve", "un"},// q
            {"i", "ia", "ian", "iang", "iao", "ie", "in", "ing", "iong", "iu", "u", "uan", "ue", "ve", "un"},// x
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ong", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// zh
            {"a", "ai", "an", "ang", "ao", "e", "en", "eng", "i", "ong", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// ch
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ou", "u", "ua", "uai", "uan", "uang", "ui", "un", "uo"},// sh
            {"an", "ang", "ao", "e", "en", "eng", "i", "ong", "ou", "u", "ua", "uan", "ui", "un", "uo"},// r
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ong", "ou", "u", "uan", "ui", "un", "uo"},// z
            {"a", "ai", "an", "ang", "ao", "e", "ei", "en", "eng", "i", "ong", "ou", "u", "uan", "ui", "un", "uo"},// c
            {"a", "ai", "an", "ang", "ao", "e", "en", "eng", "i", "ong", "ou", "u", "uan", "ui", "un", "uo"},// s
            {"a", "an", "ang", "ao", "e", "i", "in", "ing", "o", "ong", "ou", "u", "uan", "ue", "ve", "un"},// y
            {"a", "ai", "an", "ang", "ei", "en", "eng", "o", "u"},// w
    };

    public PinyinUtil() {
        for (String[] arr : pairs) {
            pairList.add(Arrays.asList(arr));
        }
        smList = Arrays.asList(shengmu);
    }

    public static PinyinUtil getInstance() {
        if (instance == null) {
            instance = new PinyinUtil();
        }
        return instance;
    }

    private boolean isShengmu(String pinyin) {
        return smList.contains(pinyin.toLowerCase());
    }

    private boolean isYunmu(String sm, String pinyin) {
        int index = 0;
        if (!TextUtils.isEmpty(sm))
            index = smList.indexOf(sm) + 1;
        return pairList.get(index).contains(pinyin.toLowerCase());
    }


    public String splitPinyin(String pinyins) {
        pinyins = pinyins.replace(" ", "").replace(" ", "").toLowerCase();
        List<String> list = new ArrayList<>();
        int len = pinyins.length();
        int i = 0;
        while (i < len) {
            String sm = "";
            String ym = "";
            if (i + 2 < len && isYunmu("", pinyins.substring(i, i + 3))) {
                ym = pinyins.substring(i, i + 3);
                i += 3;
            } else if (i + 1 < len && isYunmu("", pinyins.substring(i, i + 2))) {
                ym = pinyins.substring(i, i + 2);
                i += 2;
            } else if (i < len && isYunmu("", pinyins.substring(i, i + 1))) {
                ym = pinyins.substring(i, i + 1);
                i += 1;
            } else {
                if (i + 1 < len && isShengmu(pinyins.substring(i, i + 2))) {// 判断两位声母
                    sm = pinyins.substring(i, i + 2);
                    i += 2;
                } else if (i < len && isShengmu(pinyins.substring(i, i + 1))) {// 判断一位声母
                    sm = pinyins.substring(i, i + 1);
                    i += 1;
                }
                if (i + 3 < len && isYunmu(sm, pinyins.substring(i, i + 4))) {// 判断四位韵母
                    ym = pinyins.substring(i, i + 4);
                    i += 4;
                } else if (i + 2 < len && isYunmu(sm, pinyins.substring(i, i + 3))) {// 判断三位韵母
                    ym = pinyins.substring(i, i + 3);
                    i += 3;
                } else if (i + 1 < len && isYunmu(sm, pinyins.substring(i, i + 2))) {// 判断两位韵母
                    ym = pinyins.substring(i, i + 2);
                    i += 2;
                } else if (i < len && isYunmu(sm, pinyins.substring(i, i + 1))) {// 判断一位韵母
                    ym = pinyins.substring(i, i + 1);
                    i += 1;
                }
            }
            list.add(sm + ym);
        }
        String result = list.toString();
        list.clear();
        list = null;
        return result;
    }
}